iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
自我挑戰組

打掉重練!Django的還債之旅~系列 第 23

Day23. ORM觸發SQL的地方(這邊是print~)

  • 分享至 

  • xImage
  •  

前言

昨天那邊我推測Todo只有在他被動作的時候才會去connect DB,所以真的在被使用的地方照昨天的寫法會是在render的時候!但今天先來看看print

正題

首先先稍微驗證一下想法是不是正確的,觸發SQL的是print(todo),那在python中什麼會被print()觸發呢!?答案是magic method __repr__ or __str__

那我們接著來看ORM filter回傳的type是什麼
<class 'django.db.models.query.QuerySet'>
是這個QueruSet類別,這個我們昨天也有看到,那邊其實我到現在都還沒有很有把握說我懂了...
總之跟著這個類別下去找__repr__ or __str__這兩個magic method
https://ithelp.ithome.com.tw/upload/images/20231008/20162905N8YfursOAa.png
這邊看到會顯示出data,到表已經從db中拿到data了!
所以我們要再根據這個線索看看取得data是透過什麼方式!
這邊可以看到他對自己做slice取值self[: REPR_OUTPUT_SIZE + 1]
而這個動作又會觸發什麼magic method呢!?google一下~
找到啦~是__getitem__那我們接著看看他會做什麼~
https://ithelp.ithome.com.tw/upload/images/20231008/20162905Jsj1jJ56T5.png
我們可以知道k是slice物件,所以會流向這邊
https://ithelp.ithome.com.tw/upload/images/20231008/20162905oQOnlVyg0i.png
我這邊看了一下qs.query已經是組好的SQL了,尚未看到他怎麼組出來的~
而這邊有一個list(qs),這個會觸發magic method __iter__
https://ithelp.ithome.com.tw/upload/images/20231008/20162905ythIUszZoD.png
在根據上圖的function找
https://ithelp.ithome.com.tw/upload/images/20231008/20162905Bfw4hXgGMk.png
一樣找線索
https://ithelp.ithome.com.tw/upload/images/20231008/20162905DOaUo8RWaP.png
一樣找list的magic method __iter__
https://ithelp.ithome.com.tw/upload/images/20231008/20162905QwGhN8nyYH.png
https://ithelp.ithome.com.tw/upload/images/20231008/20162905rc1g7W4f9O.png
這邊就不細看了,粗看一下可以看到去執行SQL的地方~
先找query,直接print他的type看~
是在django.db.models.sql.query.Query
https://ithelp.ithome.com.tw/upload/images/20231008/20162905BT4wpYihVw.png
那這邊的connections我們也很熟悉了,他就是DatabaseWrapper
其中的ops.compiler呢~
https://ithelp.ithome.com.tw/upload/images/20231008/20162905M5ua8fjq21.png
https://ithelp.ithome.com.tw/upload/images/20231008/20162905VGdjNn5rO6.png
https://ithelp.ithome.com.tw/upload/images/20231008/20162905kpsWqaQekO.png
這下就找到compiler本人囉!
最後到compiler中的execute_sql就可以看到他與db連接的地方囉~

結語

就這樣挖著挖著就挖到與db連接的地方了,有很多python magic method如果沒接觸過python的可能會看不太習慣,不過還沒看到怎麼組出SQL了的地方就是了,是有看到類似的地方,看了一眼我就先當作沒看到了XD


上一篇
Day22. 今天來稍微看一下ORM的原始碼!
下一篇
Day24. render~我渲~
系列文
打掉重練!Django的還債之旅~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言